package Robot;
import java.util.Stack;

import Coleccionable.*;
import Piso.*;
import Premio.*;
import Principal.*;

/**
 * Clase Robot
 * @author Alonso,Veroni y Reissing.
 *
 */
public abstract class Robot {

        protected int combustible;
        protected int maxCombustible;
        protected int puntaje;
        protected int color;
        protected boolean pintar;
        protected char direccion;
        protected Posicion pos;
        protected Stack<Coleccionable> baul;
        
        /**
         * El contructor de la clase robot en el cual se setean la posicion y la direccion del robot.
         * @param p, es la posicion donde comienza el robot.
         * @param d, es la direccion en la cual comienza el robot.
         */
        public Robot(Posicion p, char d){
                pos=p;
                direccion=d;
                puntaje=0;
                pintar=false;
                color=0;
                baul=new Stack<Coleccionable>();
        }
        //comandos
        
        /**
         * avanzar, avanza la posicion del robot dependiendo en la direccion a la cual apunte, y si se encuentra un premio, se juntara el mismo.
         * @param p, es el terreno a la cual va a ir el robot.
         */
        public void avanzar(Transitable p){
                combustible=combustible-p.getGasto();
                switch(direccion){
                case 'N':
                        pos.setY(pos.getY()-1);
                        break;
                case 'O':
                        pos.setX(pos.getX()-1);
                        break;
                case 'S':
                        pos.setY(pos.getY()+1);
                        break;
                case 'E':
                        pos.setX(pos.getX()+1);
                        break;
                }
                
                if(p.hayPremio()){
                	Premio prem=p.getPremio();
                	prem.entregarPremio(this);
                	p.eliminarPremio();
                }
                	
        }
        
        /**
         * girarIzquierda, gira el robot para la izquierda sobre la posicion en la que esta.
         * @param p,es el piso en el cual se hace el giro.
         */
        public void girarIzquierda(Transitable p){
                combustible= combustible- p.getGasto();
                switch(direccion){
                        case 'N':
                                direccion='O';
                                break;
                        case 'O':
                                direccion= 'S';
                                break;
                        case 'S':
                                direccion= 'E';
                                break;
                        case 'E':
                                direccion= 'N';
                                break;
                }               
                        
        }
        
        /**
         * girarDerecha, gira el robot para la derecha sobre la posicion en la que esta.
         * @param p,es el piso en el cual se hace el giro.
         */
        public void girarDerecha(Transitable p){
                combustible= combustible- p.getGasto();
                switch(direccion){
                        case 'N':
                                direccion='E';
                                break;
                        case 'O':
                                direccion= 'N';
                                break;
                        case 'S':
                                direccion= 'O';
                                break;
                        case 'E':
                                direccion= 'S';
                                break;
                }               
                
        }
        
        /**
         * cambiarColor, cambia el color del robot.
         * @param color, color al que va a cambiar.
         */
        public void cambiarColor(int color){
                this.color=color;
        }
        
        /**
         * pincel, activa el pincel para pintar en caso de que este desactivado, si ya lo estaba lo descativa.
         */
        public void pincel(){
                if (pintar)
                        pintar=false;
                else
                        pintar=true;
        }
        
        /**
         * recolectar, si el baul no esta lleno, es decir si tiene menos de 20 elementos, mete un elemento al baul.
         * @param col, elemento a ingresar en el baul.
         */
        public void recolectar(Coleccionable col){
                if(baul.size()<=20)
                        baul.push(col);
                
        }
        
        /**
         * accionEspecial, ejecuta una accion especial del robot.
         */
        public abstract void accionEspecial();
        
        /**
         * sumarCombustible, suma una cantidad n al combustible del robot, sin superar el maximo de cada robot.
         * @param n, es la cantidad que se le sumara al combustible.
         */
        public void sumarCombustible(int n){
            if(n+combustible<=maxCombustible)    
            	combustible+=n;
            else
            	combustible=maxCombustible;
        }
        
        /**
         * sumarPuntos, suma una cantidad n a los puntos del robot.
         * @param puntos, es la cantidad que se le sumara a los puntos.*/
        public void sumarPuntos(int puntos){
                puntaje+=puntos;
        }
        
        /**
         * recibirPremioEspecial, recibi un premio especial para el robot.
         * @param p
         */
        public abstract void recibirPremioEspecial(Premio p);
        
        /**
         * setPosicion, setea la posicion del robot con una nueva posicion p.
         * @param p, es la posicion nueva del robot.
         */
        public void setPosicion(Posicion p){
        	pos=p;
        }
        
        //consultas
        
        /**
         * descargar, descarga un elemento del bual, si este esta vacio retorna null.
         * @return retorna el elemento descargado.
         */
        public Coleccionable descargar(){
                Coleccionable col=null;
                if(!baul.isEmpty())
                        col=baul.pop();
                return col;
        }
        
        /**
         * getPosicion, retorna la posicion del robot.
         * @return una posicion.
         */
        public Posicion getPosicion(){
                return pos;
        }
        
        /**
         * getDireccion, retorna la direccion del robot. 
         * @return un char.
         */
        public char getDireccion(){
                return direccion;
        }
        
        /**
         * estaVacio, verifica si el baul del robot esta vacio entonces retorna verdadero, en caso contrario retorna falso.
         * @return un boolean.
         */
        public boolean estaVacio(){
                return combustible==0;
        }
        
        /**
         * puedeMover, retorna verdadero si el combustible del robot le alcanza para moverse por el terreno, falso en caso contrario.
         * @param piso, es el terreno por el cual debe desplazarse.
         * @return un boolean.
         */
        public boolean puedeMover(Transitable piso){
                return combustible>=piso.getGasto();
        }
        
        /**
         * esEspecial, retorna verdadero si el robot es Militar, falso en caso contrario.
         * @return un boolean
         */
        public abstract boolean esEspecial();       
       

    	/**
    	 * getNombre, devuelve la identificacion del robot.
    	 * @return, nombre del robot.
    	 */
        
		public abstract String getNombre() ;

		/**
		 * getPuntaje, devuelve el puntaje del robot.
		 * @return int
		 */
		public int getPuntaje() {
			return puntaje;
		}

		/**
		 * setPuntaje, setea el puntaje del robot.
		 * @param puntaje, puntaje nuevo.
		 */
		public void setPuntaje(int puntaje) {
			this.puntaje = puntaje;
		}

		/**
		 * getCombustible, retorna el combustible del robot.
		 * @return int.
		 */
		public int getCombustible() {
			return combustible;
		}

		/**
		 * setCombustible, modifica el combustible del robot por el nuevo valor.
		 * @param combustible, nuevo valor.
		 */
		public void setCombustible(int combustible) {
			this.combustible = combustible;
		}

		/**
		 * isPintar, retorna verdadero si esta pintando y falso en caso contrario.
		 * @return boolean.
		 */
		public boolean isPintar() {
			return pintar;
		}

		/**
		 * setPintar, setea el valor pintar con un nuevo valor.
		 * @param pintar, valor nuevo.
		 */
		public void setPintar(boolean pintar) {
			this.pintar = pintar;
		}

		/**
		 * getColor, retorna el color que usa el robot para pintar.
		 * @return un color entero.
		 */
		public int getColor() {
			return color;
		}

		
        
        
}


